/*****************************************************************************
*                     Organizaci?n de Datos - 75.06                          *
*                         C?tedra Lic. Servetto                              *
*            Facultad de Ingenier?a - Universidad de Buenos Aires            *
******************************************************************************/ 

#include <string>
#include <iostream>
#include "../Comun/Archivo.h"
#include "ArbolBMas.h"


using namespace std;
using namespace CapaIndices;
using namespace Comun;

namespace CapaIndices{

	/*EstrategiaInsercion::EstrategiaInsercion(CapaIndices::ArbolBMas *arbol):Estrategia(arbol,false){
	}

	EstrategiaInsercion::~EstrategiaInsercion(){
	}*/
/*
	Resultado EstrategiaInsercion::EjecutarEstrategia(CapaIndices::Clave *clave){
		Resultado r;
		return r;
	}
*/

	IIndice* ObtenerIndicePrimario(string nombreClase){
		return NULL;
	}
	
	ArchivoTemp::ArchivoTemp(string nombre){
		 this->grupos = new list<Grupo>();
		 this->Nombre = nombre;
		 lastId = -1;
		 nodos = new Nodo*[0];

	 }
	 ArchivoTemp::~ArchivoTemp(){}

	void ArchivoTemp::BorrarGrupo(int grupoId){
		
		//cout << "Eliminacion: " << grupoId;
		
	}

	int ArchivoTemp::CrearGrupo(Grupo &grupo)
	{
		grupo.GrupoId = ++lastId;
		Nodo** newNodos = new Nodo*[lastId+1];
		for (int i = 0; i< lastId;i++)
			newNodos[i] = nodos[i];

		Nodo* n = new Nodo(grupo);
		n->Sincronizar(true);
		newNodos[lastId] = n;
		delete nodos;
		nodos = new Nodo*[lastId+1];
		
		for (int i = 0; i< lastId+1;i++)
			nodos[i] = newNodos[i];
		
		return lastId;
	}

	CodigoResultado ArchivoTemp::GuardarGrupo(Grupo &grupo, bool omitirSubflujo)
	{
		if (Nombre == "Indice")
		{
			for (IteradorDeRegistros i = grupo.Registros.begin();i!= grupo.Registros.end();i++)
				(* i).Tamanio = 15;
		}else{
			for (IteradorDeRegistros i = grupo.Registros.begin();i!= grupo.Registros.end();i++)
				(* i).Tamanio = 30;
		}
		
		//cout << "Grupo Guardado: " << grupo.GrupoId;
		if (grupo.Registros.size()<2 && !omitirSubflujo)
			return Subflujo;
		else if (grupo.Registros.size()>4)
			return Sobreflujo;
		else if (&grupo.Registros != &nodos[grupo.GrupoId]->Registros)
		{
			nodos[grupo.GrupoId]->Registros.clear();
			nodos[grupo.GrupoId]->Atributos.clear();

			for (IteradorDeAtributos i = grupo.Atributos.begin();i!= grupo.Atributos.end();i++)
				nodos[grupo.GrupoId]->Atributos.insert(nodos[grupo.GrupoId]->Atributos.end(),*i);

			for (IteradorDeRegistros i = grupo.Registros.begin();i!= grupo.Registros.end();i++)
			{
				nodos[grupo.GrupoId]->Registros.insert(nodos[grupo.GrupoId]->Registros.end(),*i);

			}
		}
		return Exito;
	}

	Grupo& ArchivoTemp::LeerGrupo(int grupoId){
		//cout << "Grupo Pedido: " << grupoId;
		
		return *nodos[grupoId];
	}

	int ArchivoTemp::PrimerGrupo(){
		return 0;
	}

	int ArchivoTemp::SiguienteGrupo(int grupoIdActual){
		return 0;
	}

	void ArchivoTemp::Crear(){
		lastId = -1;
if (Nombre == "Indice"){
		
		nodos = new Nodo*[1];
	

		// Raiz
		nodos[0] = new Nodo();	
		nodos[0]->NodoId = 0;			
		nodos[0]->Contador = 0;
		nodos[0]->HijoIzquierdo = -1;
		nodos[0]->Tipo = CapaIndices::Hoja;	
		nodos[0]->Sincronizar(true);
		lastId =0;
		
}else{
	nodos = new Nodo*[0];
}

		/*if (Nombre == "Indice")
		{
		nodos = new Nodo*[3];
		lastId = 2;

		// Raiz
		nodos[0] = new Nodo();	
		nodos[0]->NodoId = 0;			
		nodos[0]->Contador = 1;
		nodos[0]->HijoIzquierdo = 1;
		nodos[0]->Tipo = TipoNodo::Interno;			

		Registro* r = new Registro();
		Atributo ra("Id","100");
		Atributo ra1("HijoDerecho","2");
		ra.Tipo = Entero;
		ra1.Tipo = Entero;
		r->Atributos.insert(r->Atributos.end(),ra);
		r->Atributos.insert(r->Atributos.end(),ra1);
		r->Tamanio = 15;

		nodos[0]->Registros.insert(nodos[0]->Registros.end(),*r);

		// Nodo 1
		nodos[1] = new Nodo();	
		nodos[1]->NodoId = 1;			
		nodos[1]->Contador = 3;			
		nodos[1]->HijoIzquierdo = 0;
		nodos[1]->NodoAnterior = -1;
		nodos[1]->NodoSiguiente = 2;
		nodos[1]->Tipo = TipoNodo::Hoja;

		Registro* r1 = new Registro();

		Atributo ra2("Id","25");
		Atributo ra3("HijoDerecho","1");
		ra2.Tipo = Entero;
		ra3.Tipo = Entero;

		r1->Atributos.insert(r1->Atributos.end(),ra2);
		r1->Atributos.insert(r1->Atributos.end(),ra3);
		r1->Tamanio = 15;

		nodos[1]->Registros.insert(nodos[1]->Registros.end(),*r1);

		Registro* r2 = new Registro();

		Atributo ra4("Id","40");
		Atributo ra5("HijoDerecho","2");
		ra4.Tipo = Entero;
		ra5.Tipo = Entero;
		r2->Atributos.insert(r2->Atributos.end(),ra4);
		r2->Atributos.insert(r2->Atributos.end(),ra5);
		r2->Tamanio = 15;

		nodos[1]->Registros.insert(nodos[1]->Registros.end(),*r2);

		Registro* r3 = new Registro();

		Atributo ra6("Id","75");
		Atributo ra7("HijoDerecho","3");
		ra6.Tipo = Entero;
		ra7.Tipo = Entero;
		r3->Atributos.insert(r3->Atributos.end(),ra6);
		r3->Atributos.insert(r3->Atributos.end(),ra7);
		r3->Tamanio = 15;

		nodos[1]->Registros.insert(nodos[1]->Registros.end(),*r3);

		// Nodo 2
		nodos[2] = new Nodo();	
		nodos[2]->NodoId = 2;			
		nodos[2]->Contador = 3;
		nodos[2]->HijoIzquierdo = 4;			
		nodos[2]->NodoAnterior = 1;
		nodos[2]->NodoSiguiente = -1;
		nodos[2]->Tipo = TipoNodo::Hoja;

		Registro* r4 = new Registro();

		Atributo ra8("Id","120");
		Atributo ra9("HijoDerecho","5");
		ra8.Tipo = Entero;
		ra9.Tipo = Entero;
		r4->Atributos.insert(r4->Atributos.end(),ra8);
		r4->Atributos.insert(r4->Atributos.end(),ra9);
		r4->Tamanio = 15;

		nodos[2]->Registros.insert(nodos[2]->Registros.end(),*r4);

		Registro* r5 = new Registro();

		Atributo ra10("Id","170");
		Atributo ra11("HijoDerecho","6");
		ra10.Tipo = Entero;
		ra11.Tipo = Entero;
		r5->Atributos.insert(r5->Atributos.end(),ra10);
		r5->Atributos.insert(r5->Atributos.end(),ra11);
		r5->Tamanio = 15;

		nodos[2]->Registros.insert(nodos[2]->Registros.end(),*r5);

		Registro* r6 = new Registro();

		Atributo ra12("Id","230");
		Atributo ra13("HijoDerecho","7");
		ra12.Tipo = Entero;
		ra13.Tipo = Entero;
		r6->Atributos.insert(r6->Atributos.end(),ra12);
		r6->Atributos.insert(r6->Atributos.end(),ra13);
		r6->Tamanio = 15;

		nodos[2]->Registros.insert(nodos[2]->Registros.end(),*r6);

		nodos[0]->Sincronizar();
		nodos[1]->Sincronizar();
		nodos[2]->Sincronizar();

		}
		else
		{
		nodos = new Nodo*[8];
		lastId = 7;

		// Nodo 0
		nodos[0]= new Nodo();
		nodos[0]->NodoId = 0;
		nodos[0]->NodoAnterior = -1;
		nodos[0]->NodoSiguiente = 1;
		nodos[0]->Contador = 3;			

		Registro* r = new Registro();
		Atributo* ra1= new Atributo("Id","1");
		Atributo* ra2= new Atributo("Nombre","Numero Uno");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[0]->Registros.insert(nodos[0]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","10");
		ra2= new Atributo("Nombre","Numero Diez");
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[0]->Registros.insert(nodos[0]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","13");
		ra2= new Atributo("Nombre","Numero Trece");
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[0]->Registros.insert(nodos[0]->Registros.end(),*r);

		// Nodo 1
		nodos[1]= new Nodo();
		nodos[1]->NodoId = 1;			
		nodos[1]->Contador = 3;	
		nodos[1]->NodoAnterior = 0;
		nodos[1]->NodoSiguiente = 2;

		r = new Registro();
		ra1= new Atributo("Id","25");
		ra2= new Atributo("Nombre","Numero Veinticinco");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[1]->Registros.insert(nodos[1]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","30");
		ra2= new Atributo("Nombre","Numero Treinta");
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[1]->Registros.insert(nodos[1]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","31");
		ra2= new Atributo("Nombre","Numero Treinta y uno");
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[1]->Registros.insert(nodos[1]->Registros.end(),*r);

		// Nodo 2
		nodos[2]= new Nodo();
		nodos[2]->NodoId = 2;
		nodos[2]->Contador = 2;	
		nodos[2]->NodoAnterior = 1;
		nodos[2]->NodoSiguiente = 3;

		r = new Registro();
		ra1= new Atributo("Id","40");			
		ra2= new Atributo("Nombre","Numero Cuarenta");			
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[2]->Registros.insert(nodos[2]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","43");			
		ra2= new Atributo("Nombre","Numero Cuarenta y tres");			
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[2]->Registros.insert(nodos[2]->Registros.end(),*r);

		// Nodo 3
		nodos[3]= new Nodo();
		nodos[3]->NodoId = 3;
		nodos[3]->Contador = 3;	
		nodos[3]->NodoAnterior = 2;
		nodos[3]->NodoSiguiente = 4;

		r = new Registro();
		ra1= new Atributo("Id","75");			
		ra2= new Atributo("Nombre","Numero setenta y cinco");			
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[3]->Registros.insert(nodos[3]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","77");			
		ra2= new Atributo("Nombre","Numero Setenta y siete");			
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[3]->Registros.insert(nodos[3]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","90");			
		ra2= new Atributo("Nombre","Numero noventa");			
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[3]->Registros.insert(nodos[3]->Registros.end(),*r);

		// Nodo 4
		nodos[4]= new Nodo();
		nodos[4]->NodoId = 4;			
		nodos[4]->Contador = 2;	
		nodos[4]->NodoAnterior = 3;
		nodos[4]->NodoSiguiente = 5;

		r = new Registro();
		ra1= new Atributo("Id","100");
		ra2= new Atributo("Nombre","Numero Cien");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[4]->Registros.insert(nodos[4]->Registros.end(),*r);


		r = new Registro();
		ra1= new Atributo("Id","105");
		ra2= new Atributo("Nombre","Numero Ciento cinco");
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[4]->Registros.insert(nodos[4]->Registros.end(),*r);

		// Nodo 4
		nodos[5]= new Nodo();
		nodos[5]->NodoId = 5;			
		nodos[5]->Contador = 3;		
		nodos[5]->NodoAnterior = 4;
		nodos[5]->NodoSiguiente = 6;

		r = new Registro();
		ra1= new Atributo("Id","121");
		ra2= new Atributo("Nombre","Numero Ciento vientiuno");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[5]->Registros.insert(nodos[5]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","122");
		ra2= new Atributo("Nombre","Numero Ciento veintidos");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[5]->Registros.insert(nodos[5]->Registros.end(),*r);	

		r = new Registro();
		ra1= new Atributo("Id","123");
		ra2= new Atributo("Nombre","Numero Ciento veintitres");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[5]->Registros.insert(nodos[5]->Registros.end(),*r);	

		// Nodo 6
		nodos[6]= new Nodo();
		nodos[6]->NodoId = 6;			
		nodos[6]->Contador = 2;			
		nodos[6]->NodoAnterior = 5;
		nodos[6]->NodoSiguiente = 7;

		r = new Registro();
		ra1= new Atributo("Id","170");
		ra2= new Atributo("Nombre","Numero Ciento setenta");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[6]->Registros.insert(nodos[6]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","179");
		ra2= new Atributo("Nombre","Numero Ciento setenta y nueve");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[6]->Registros.insert(nodos[6]->Registros.end(),*r);

		// Nodo 7
		nodos[7]= new Nodo();
		nodos[7]->NodoId = 7;			
		nodos[7]->Contador = 2;	
		nodos[7]->NodoAnterior = 6;
		nodos[7]->NodoSiguiente = 8;						

		r = new Registro();
		ra1= new Atributo("Id","230");
		ra2= new Atributo("Nombre","Numero Doscientos treinta");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[7]->Registros.insert(nodos[7]->Registros.end(),*r);

		r = new Registro();
		ra1= new Atributo("Id","300");
		ra2= new Atributo("Nombre","Numero Ciento trescientos");	
		ra1->Tipo = Entero;
		ra2->Tipo = Cadena;
		r->Atributos.insert(r->Atributos.end(),*ra1);
		r->Atributos.insert(r->Atributos.end(),*ra2);
		r->Tamanio = 30;

		nodos[7]->Registros.insert(nodos[7]->Registros.end(),*r);

		for (int i=0; i<8;i++)
		{
		nodos[i]->Sincronizar();
		}
		}

		}*/
	}
}
/*
namespace Comun
{
	Atributo::Atributo()
	{
	};

	Atributo::Atributo(string nombre, string valor)
	{
		this->Nombre = nombre;
		this->Valor = valor;
	};

	Atributo::~Atributo()
	{
	};

	// Registro

	Registro::Registro() : Atributos( inicializadorAtributos )
	{
		Marcado = false;
	};

	Registro::~Registro()
	{
	};

	// Grupo

	Grupo::Grupo() : Atributos( inicializadorAtributos ), Registros( inicializadorRegistros )
	{
	};

	Grupo::~Grupo()
	{
	};

	// MetadatosAtributo

	MetadatosAtributo::MetadatosAtributo(string nombre, TipoRegistro tipo)
	{
		this->Nombre = nombre;
		this->Tipo = tipo;
	};

	MetadatosAtributo::~MetadatosAtributo()
	{
	};

	// MetadatosRegistro

	MetadatosRegistro::MetadatosRegistro() : MetadatosAtributos( inicializadorMetadatosAtributos )
	{
	};

	MetadatosRegistro::~MetadatosRegistro()
	{
	};

	// MetadatosGrupo

	MetadatosGrupo::MetadatosGrupo() : MetadatosAtributos( inicializadorMetadatosAtributos )
	{
	};

	MetadatosGrupo::~MetadatosGrupo()
	{
	};

	// MetadatosArchivo

	MetadatosArchivo::MetadatosArchivo(string nombre)
	{
		this->Nombre = nombre;
	};

	MetadatosArchivo::~MetadatosArchivo()
	{
	};

	bool Registro::operator ==(const Comun::Registro &comp) const{
		IteradorDeAtributos j = comp.Atributos.begin();
		
		for (IteradorDeAtributos i = Atributos.begin(); i != Atributos.end(); i++, j++)
			if ( !( (*i).Valor.compare((*j).Valor) == 0) )
				return false;

		return true;			
	}

}*/
